package s0404.dao.mapper;

import s0404.dao.UserDao;
import s0404.entity.User;
import s0404.exception.BaseException;
import s0404.util.JdbcHelper;

import java.sql.*;


public final class UserDaoImpl implements UserDao {

    @Override
    public User find(Connection connection, Integer id) throws SQLException, BaseException {
        //创建School类型的引用，暂不创建对象
        User desiredUser = null;
        //获得数据库连接
        String sql_select_id = "SELECT * FROM bysj.user WHERE id = ?";
        PreparedStatement pstmt_select_id = connection.prepareStatement(sql_select_id);
        pstmt_select_id.setInt(1, id);
        ResultSet resultSet_select_id = pstmt_select_id.executeQuery();
        //如果表中存在id对应的记录，则获得表中的字段值，并创建对象
        if (resultSet_select_id.next()) {
            String username = resultSet_select_id.getString("username");
            String password = resultSet_select_id.getString("password");
            desiredUser = new User(id,username,password);
        }
        return desiredUser;
    }

    //不返回user， 修改它的id是不是就可以了
     @Override
    public void login(Connection connection, User user) throws SQLException {
        String sql_login = "SELECT * FROM user WHERE username =? and password=?";
        PreparedStatement pstmt_login =
                connection.prepareStatement(sql_login);
        pstmt_login.setString(1, user.getUsername());
        pstmt_login.setString(2, user.getPassword());
        ResultSet resultSet_login = pstmt_login.executeQuery();
        //如果表中存在id对应的记录，则获得表中的user_id，并获得对应的User对象
        if (resultSet_login.next()) {
            int user_id = resultSet_login.getInt("id");
            //写入id，Controller中认为User对象拥有id，即为合法用户
            user.setId(user_id);
        }
    }

    /**
     * 根据id，查找User各个子类的对象
     *
     * @param connection
     * @param id         目标对象的id
     * @return id对应的目标对象
     * @throws SQLException
     */
    
//    public User find(Connection connection, int id) throws SQLException {
//        //先后在Sudent和Teacher中查找相应的id
//        User desiredUser = null;
//        //查询id对应的Student对象
//        desiredUser = StudentService.getInstance().find(id);
//        if (desiredUser != null) {
//            return desiredUser;
//        }
//        //查询id对应的Teacher对象
//        desiredUser = TeacherService.getInstance().find(id);
//        return desiredUser;
//        //在各子类对象中均未查询到
//    }

    


    

    /**
     * TeacherService.add在调用本方法之前，还会调用TeacherDao.add方法
     * 两次对Dao的调用要保证是同一Connection对象，才能将它们设置在同一事务中
     * @param user 要增加到数据库表中的User对象
     * @param connection 来自Service的Connection对象
     * @return 成功增加true，失败：false
     * @throws SQLException
     */
    @Override
    public int add(Connection connection, User user) throws SQLException {

        //根据连接对象准备语句对象，如果SQL语句为多行，注意语句不同部分之间要有空格
        //创建语句对象, 字段lastLoginTime 为“时间戳”类型，无须手动写入
        PreparedStatement pstmt =
                connection.prepareStatement("INSERT INTO user " +
                        " (username,password)" +
                        " VALUES(?,?,?)",Statement.RETURN_GENERATED_KEYS);
        //要求返回新加元组的主键
        //执行预编译语句，用其返回值、影响的行数为赋值affectedRowNum
        int affectedRowNum = pstmt.executeUpdate();
        int idOfAddedUser = 0;
        ResultSet resultSet = pstmt.getGeneratedKeys();//获得生成的主键集合
        if (resultSet.next()) {
            idOfAddedUser = resultSet.getInt(1);//读取第一个主键
        }
        //本方法是事务的一部分，不能释放数据库连接
        JdbcHelper.close(pstmt);
        //新增元组的id
        return idOfAddedUser;
    }
    /**
     * 根据用户名查找
     * @param username 要查找的用户名
     * @return 符合条件的对象
     * @throws SQLException
     */
    
//    public User findByName(String username) throws SQLException {
//        User desiredUser = null;
//        Connection connection = JdbcHelper.getConn();
//        PreparedStatement preparedStatement =
//                connection.prepareStatement("SELECT * FROM user WHERE username=?");
//        preparedStatement.setString(1,username);
//        ResultSet resultSet = preparedStatement.executeQuery();
//        if(resultSet.next()){
//            int id = resultSet.getInt("id");
//            String password = resultSet.getString("password");
//            Timestamp timestamp = resultSet.getTimestamp("lastLoginTime");
//            LocalDateTime lastLoginTime = null;
//            if(timestamp!=null) {
//                lastLoginTime = timestamp.toLocalDateTime();
//            }
//            int teacherId = resultSet.getInt("teacher_id");
//            Teacher teacherOfUser = TeacherDao.getInstance().find(teacherId, connection);
//            //以当前元组的各个字段值为参数，创建User对象
//            desiredUser =
//                    new User(id,username,password,lastLoginTime);
//        }
//        return desiredUser;
//    }
    /**
     *  用户名的基础部分在user表中存的情况下，调用本方法
//    * @param username 用户名的基础部分，如:lkq
//    * @return 用户名的基础部分+序号（整体用户名不存在），如:lkq5
//    * @throws SQLException
//    */
//    public String generateUsername(String username)throws SQLException {
//        //序列号初值为1
//        int usernameSN = 1;
//        //将参数和序列号连接起来，到表中查询
//        while(this.findByName(username+usernameSN)!=null){
//            usernameSN++;
//        }
//        return username + usernameSN;
//    }
//
//
//    public boolean delete(Integer id) throws SQLException {
//        User user = this.find(id);
//        return this.delete(user);
//    }
//
//
//    public boolean delete(User user) throws SQLException {
//        return users.remove(user);
//    }




//    @Override
//    public User login(Connection connection, User user) throws SQLException {
//        User currentUser = null;
//        String sql_login = "SELECT * FROM user WHERE username =? and password=?";
//        PreparedStatement pstmt_login =
//                connection.prepareStatement(sql_login);
//        pstmt_login.setString(1, user.getUsername());
//        pstmt_login.setString(2, user.getPassword());
//        ResultSet resultSet_login = pstmt_login.executeQuery();
//        //如果表中存在id对应的记录，则获得表中的user_id，并获得对应的User对象
//        if (resultSet_login.next()) {
//            int user_id = resultSet_login.getInt("user_id");
//            currentUser = UserService.getInstance().find(user_id);
//        }
//        return currentUser;
//    }

}
